﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "GcmpApiDeclaration.h"
#include "NdbDataSchema.h"

namespace gcmp
{
    class ILine3d;
    class Vector3d;
    class IPolygon;  

    /// \brief 填充模式目标
    SERIALIZABLE_ENUM_CLASS(FillPatternTarget)
    {
        Model = 0,/// 模型模式，填充图案跟随模型变化，不受视图比例影响
        Drafting = 1/// 绘图模式，填充图案跟随视图变化,会受视图比例影响, 需要填充融合
    };

    /// \brief 填充模式
    ///
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IFillPatternData : public IDbObject
    {
    public:
        /// \brief 析构函数
        ///
        virtual ~IFillPatternData();
     
        
        /// \brief 从填充模式文件（后缀为pat）创建加载填充模式列表
        /// \param fileName 文件名称
        /// \return 获得的填充格式列表
        static std::vector<OwnerPtr<IFillPatternData>> Create(const std::wstring& fileName);

        /// \brief 根据名称创建填充数据并返回
        ///
        /// 如果名称为空，则创建失败
        /// \param name 填充名称
        /// \return 获得的填充数据
        static OwnerPtr<IFillPatternData> CreateByName(const std::wstring& name);

        /// \brief 判断填充模式文件（后缀为pat）是否有效
        /// \param fileName 文件名称
        /// \return true-文件有效 false-文件无效
        static bool IsFillPatternFileValid(const std::wstring& fileName);

        /// \brief 获取填充类型描述
        /// \return 获得的填充类型描述
        virtual std::wstring GetDescription() const = 0;

        /// \brief 设置填充类型描述
        /// \param description 填充类型描述
        /// \return bool true：设置成功 false：设置失败
        virtual bool SetDescription(std::wstring description) = 0;

        /// \brief 获取填充类型的填充字符串
        /// \return 获得的填充类型的填充字符串
        virtual std::wstring GetPatternString() const = 0;

        /// \brief 设置填充类型的填充字符串
        /// \param description 填充类型的填充字符串
        /// \return bool true：设置成功 false：设置失败
        virtual bool SetPatternString(std::wstring patternString) = 0;

        /// \brief 获取填充类型名称
        /// \return 获得的填充类型名称
        virtual std::wstring GetName() const = 0;

        /// \brief 设置填充图案的缩放倍数
        /// \param scale 缩放倍数
        /// \return bool true：设置成功 false：设置失败
        virtual bool SetScale(double scale) = 0;

        /// \brief 获取填充图案的缩放倍数
        /// \return 缩放倍数
        virtual double GetScale() const = 0;

        /// \brief 设置填充图案的旋转角度
        /// \param rotateAngle 旋转角度(此处的角度即角度，非弧度)
        /// \return bool true：设置成功 false：设置失败
        virtual bool SetRotateAngle(double rotateAngle) = 0;

        /// \brief 获取填充图案的旋转角度
        /// \return 旋转角度(此处的角度即角度，非弧度)
        virtual double GetRotateAngle() const = 0;

        /// \brief 设置是否实体填充
        /// \param isSolid 是否实体填充
        /// \return bool true：设置成功 false：设置失败
        virtual bool SetIsSolid(bool isSolid) = 0;

        /// \brief 获取是否实体填充
        /// \return 返回是否实体填充，ture：是实体填充 false：不是实体填充
        virtual bool IsSolid() const = 0;

        /// \brief 设置填充模式目标
        /// \param target 填充模式目标
        virtual void SetTarget(FillPatternTarget target) = 0;

        /// \brief 获取填充模式目标
        /// \return 返回是填充模式目标
        virtual FillPatternTarget GetTarget() const = 0;

        /// \brief 根据当前的填充模式，离散给定区域，离散结果包含一组三角面、一组线段和一组点。
        /// \param[in] pPolygon 多边形区域
        /// \param[in] scale 填充缩放因子。填充模式也有一个缩放值，它们之间的关系如下：如果缩放因子为负值，采用填充模式上的缩放值，如果是非负值，采用当前设置的缩放值。
        /// \param[out] triangles 离散后的三角面片集，从0开始，每三个点表示一个三角面，比如(0,1,2), (3,4,5)，(6,7,8)...
        /// \param[out] lines 离散后的线段集，从0开始，每两个点表示一条线段，比如(0,1), (2,3)，(4,5)...
        /// \param[out] points 离散后的点集
        /// \return 成功返回true，失败返回false
        virtual bool Discrete(const IPolygon* pPolygon, double scale, std::vector<Vector3d>& triangles, std::vector<Vector3d>& lines, std::vector<Vector3d>& points) const = 0;

        /// \brief 克隆
        ///
        /// 将自己复制一份
        /// \return 自己的副本
        virtual OwnerPtr<IFillPatternData> Clone() const = 0;

        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该外部对象所属Element
        /// \return const IElement* 所属Element
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 获得该外部对象所属Element
        /// \return IElement* 所属Element
        virtual IElement* GetOwnerElement() = 0;
    };
}

